package com.ethan.crm.util;

import com.ethan.crm.domain.Employee;
import com.ethan.crm.domain.Menu;
import com.ethan.crm.domain.Permission;
import com.ethan.crm.service.IPermissionService;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpSession;
import java.util.List;

@Component
public class PermissionsUtil {

    /**
     * 针对static静态成员，我们有一些最基本的常识：
     * 静态变量（成员）它是属于类的，而非属于实例对象的属性；
     * 同样的静态方法也是属于类的，普通方法（实例方法）才属于对象。
     * 而Spring容器管理的都是实例对象，包括它的@Autowired依赖注入的均是容器内的对象实例，
     * 所以对于static成员是不能直接使用@Autowired注入的。
     */
    private static IPermissionService permissionService;


    @Autowired
    public void setPermissionService(IPermissionService permissionService) {
        PermissionsUtil.permissionService = permissionService;
    }

    public static boolean  checkPermission(String functionPermission){
        HttpSession session = UserContext.get().getSession();
        Employee currentUser = (Employee) session.getAttribute(UserContext.USER_IN_SESSION);
        //超级管理员直接放行
        if (currentUser.getAdmin()){
            return true;
        }
        //1. 拿到所有的权限信息
        if (CommonUtil.allPermissions.size() == 0){
            //从数据库中将所有的权限查出来
            List<Permission> permissionList = permissionService.selectAll();
            for (Permission permission : permissionList) {
                CommonUtil.allPermissions.add(permission.getResource());
            }
        }

        //2.如果包含，那么该地址需要权限控制
        if (CommonUtil.allPermissions.contains(functionPermission)){
            //通过session拿到用户的所有的权限
            List<String> userPermissions = (List<String>) session.getAttribute(UserContext.PERMISSION_IN_SESSION);
            //完全匹配
            if (userPermissions.contains(functionPermission)){
                return true;
            }else{
                //ALL权限匹配
                String allPermission = functionPermission.split(":")[0] + ":all";
                if (userPermissions.contains(allPermission)){
                    return true;
                }else {
                    return false;
                }

            }
        }else {
            //如果没有，不需要权限控制，直接放行
            return true;
        }

    }

    /**
     * 查询出所有的菜单，将用户没有的菜单权限给删除掉
     * @param allRootMenu
     * @return
     */
    public static void checkMenu(List<Menu> allRootMenu){

        //获取用户所拥有的所有权限
        List<String> userPermissions = (List<String>) UserContext.get().getSession().getAttribute(UserContext.PERMISSION_IN_SESSION);

        for (int i = allRootMenu.size()-1; i >= 0 ; i--) {
            Menu menu = allRootMenu.get(i);
            //如果该菜单的function不为空，说明受权限控制
            if (StringUtils.isNotBlank(menu.getFunction())){
                if (!userPermissions.contains(menu.getFunction())){//用户权限不包含该菜单权限
                    //删除掉该菜单的权限
                    allRootMenu.remove(i);
                }
            }
            List<Menu> children = menu.getChildren();
            if (!children.isEmpty()){
                checkMenu(menu.getChildren());
            }
        }
    }

}
